from typing import List
from common.enum.strategy_group_enum import StrategyGroup
from common.enum.strategy_type_enum import StrategyType
from dto.strategy_info import StrategyInfoMetadata
from dto.strategy_assessment import RiskAssessment
from dto.strategy_stock_day import StrategyStockDay
from service.strategy.base_strategy import BaseStrategy
from dto.strategy_calculate_result import StrategyCalculateResult
from service.strategy.strategy_result_cache import StrategyResultCache


class RiskLevelBasedStrategy(BaseStrategy):
    """
    风险策略：基于 StrategyResultCache 中的 000001.SH 的 risk_level 和 latest_price 分析对应风险。
    若 latest_price 超过 3000 点：
    - 若 risk_level > 5，初始得分为 1。
    - risk_level 每增加 5，额外得 1 分。
    """

    def analyze(self, stock_code: str, cache: StrategyResultCache) -> RiskAssessment:
        """
        根据缓存中的 000001.SH 的数据分析风险。
        """
        node_point = 0
        description = ""

        # 从缓存中获取 000001.SH 的数据
        cached_result: StrategyCalculateResult = cache.get("000001.SH")

        if not cached_result:
            description = "缓存中未找到 000001.SH 的数据。"
            return RiskAssessment(
                stock_code=stock_code,
                description=description,
                config=self.strategyConfig(),
                node_point=node_point,
            )

        latest_price = cached_result.latest_price
        risk_level = cached_result.risk_level

        # 判断 latest_price 是否超过 3000 点
        if latest_price and latest_price > 3000:
            if risk_level > 5:
                # 初始得分为 1
                node_point += 1
                extra_points = (risk_level - 5) // 5  # 每增加 5，得额外 1 分
                node_point += extra_points

                description += f"最新股价为 {latest_price} 点，超过 3000 点，风险等级为 {risk_level}，总得分 {node_point}。"
            else:
                description += f"最新股价为 {latest_price} 点，超过 3000 点，但风险等级较低（{risk_level}）。"
        else:
            description += f"最新股价为 {latest_price} 点，未超过 3000 点，无额外评分。"

        return RiskAssessment(
            stock_code=stock_code,
            description=description,
            config=self.strategyConfig(),
            node_point=node_point,
        )

    def strategyConfig(self) -> StrategyInfoMetadata:
        """
        返回策略的配置
        """
        return StrategyInfoMetadata(
            strategy_code="risk_level_based",
            strategy_name="基于风险等级的策略",
            strategy_group=StrategyGroup.RISK,  # 风险型策略
            strategy_type=StrategyType.COMPREHENSIVE,  # 基于风险类型
            analysis_day=1,
            strategy_level=2,  # 策略等级设置为 2
        )
